package com.itheima.book.controller;

import com.itheima.book.pojo.entity.User;
import com.itheima.book.service.UserService;
import com.itheima.book.utils.result.Result;
import com.itheima.book.utils.thirdparty.SmsComponent;
import com.itheima.book.utils.oss.AliOSSUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpSession;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@Slf4j
@RequestMapping("/api")
@Api(tags = "通用相关接口")
public class CommonController {

    @Autowired
    private SmsComponent smsComponent;
    @Autowired
    private AliOSSUtils aliOSSUtils;
    @Autowired
    private UserService userService;
    @Autowired(required = false)
    private JavaMailSender sender;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    /**
     * 登录验证码短信发送(需要校验用户是否存在)
     * @param mobile
     * @param session
     */
    // 获取短信验证码的方法
    @GetMapping("/sms/sendcode")
    @ApiOperation("登录验证码短信发送(需要校验用户是否存在)")
    public Result loginsendCode(@RequestParam("phone") String mobile, HttpSession session) {
        //发送验证码之前校验当前手机号用户是否存在
        userService.getByphone(mobile);
        log.info("验证码短信发送:{}",mobile);
        // 生成 5 位数字验证码
        String code = (Math.random() + "").substring(2, 7); // 生成6位随机数
        System.out.println("生成的验证码: " + code);

        // 验证码的再次校验(放在session中)
        session.setAttribute("code", code);

        // 发送短信验证码
        smsComponent.sendSmsCode(mobile, code);
        // 缓存验证码到 Redis
        redisTemplate.opsForSet().add(mobile+"code",code);
        // 设置验证码过期时间（60 秒）
        redisTemplate.expire(mobile+"code", 60, TimeUnit.SECONDS);
        return Result.success();
    }
    /**
     * 登录验证码短信发送(无需校验用户是否存在)
     * @param mobile
     * @param session
     */
    // 获取短信验证码的方法
    @GetMapping("/sms/singup/sendcode")
    @ApiOperation("登录验证码短信发送(无要校验用户是否存在)")
    public Result sendCode(@RequestParam("phone") String mobile, HttpSession session) {
        //发送验证码之前校验当前手机号用户是否存在
        userService.getByphonesingup(mobile);
        log.info("验证码短信发送:{}",mobile);
        // 生成 5 位数字验证码
        String code = (Math.random() + "").substring(2, 7); // 生成6位随机数
        System.out.println("生成的验证码: " + code);

        // 验证码的再次校验(放在session中)
        session.setAttribute("code", code);

        // 发送短信验证码
        //smsComponent.sendSmsCode(mobile, code);
        // 缓存验证码到 Redis
        redisTemplate.opsForSet().add(mobile+"code",code);
        // 设置验证码过期时间（60 秒）
        redisTemplate.expire(mobile+"code", 60, TimeUnit.SECONDS);
        return Result.success();
    }

    @PostMapping("/email/code")
    @ApiOperation("验证码邮箱发送")
    public Result sendEmailCode(@RequestBody Map<String, Object> body) {
        // 从 JSON 数据中提取 email 参数
        Object emailObject = body.get("email");
        if (emailObject == null || emailObject.toString().trim().isEmpty()) {
            log.error("邮箱参数为空");
            return Result.error("邮箱参数为空");
        }
        String email = emailObject.toString();

        try {
            // 解码邮箱地址
            email = URLDecoder.decode(email, StandardCharsets.UTF_8.name());
            log.info("验证码邮箱发送email:{}", email);
            // 发送验证码之前校验当前邮箱用户是否存在
            userService.getByemail(email);

            String code = (Math.random() + "").substring(2, 8); // 生成6位随机数
            SimpleMailMessage message = new SimpleMailMessage();
            message.setSubject("校园二手书交易"); // 发送邮件的主题
            message.setText("您好，您正在操作敏感信息，需要核验您的身份,您收到的验证码为:" + code); // 邮件的内容
            message.setTo(email); // 指定要接收邮件的用户邮箱账号
            message.setFrom("641551175@qq.com"); // 邮件发送方，也就是配置文件中的邮件地址。
            sender.send(message); // 调用send方法发送邮件
            redisTemplate.opsForSet().add(email+"code",code);
            // 设置验证码过期时间（60 秒）
            redisTemplate.expire(email+"code", 60, TimeUnit.SECONDS);
            log.info("验证码邮箱发送email:{},code:{}", email,code);
            return Result.success();
        } catch (UnsupportedEncodingException e) {
            log.error("解码邮箱地址失败", e);
            return Result.error("解码邮箱地址失败");
        }
    }
    /**
     * 文件上传
     * @param file 文件
     * @return 文件访问URL
     */
    @PostMapping("/upload/avatar")
    @ApiOperation("文件上传")
    public Result<String> uploadAvatar(MultipartFile file) {
        log.info("文件上传: {}", file.getOriginalFilename());
        try {
            // 判断文件类型
            String contentType = file.getContentType();
            if (!contentType.startsWith("image/")) {
                return Result.error("只能上传图片文件");
            }
            
            // 判断文件大小
            long size = file.getSize();
            if (size > 2 * 1024 * 1024) { // 2MB
                return Result.error("文件大小不能超过2MB");
            }

            String url = aliOSSUtils.upload(file);
            return Result.success(url);
        } catch (Exception e) {
            log.error("文件上传失败", e);
            return Result.error("文件上传失败");
        }
    }
}
